package com.chatmcp.mcprouter.service;

import com.chatmcp.mcprouter.dto.ProxyInfoDto;
import com.chatmcp.mcprouter.jsonrpc.JsonRpcRequest;
import com.chatmcp.mcprouter.jsonrpc.JsonRpcResponse;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

/**
 * 代理服务接口
 * 简化版本只包含基本功能
 */
public interface ProxyService {

    /**
     * 保存代理日志
     * @param proxyInfo 代理信息
     * @deprecated 使用 logToolCall 代替
     */
    @Deprecated
    void saveProxyLog(ProxyInfoDto proxyInfo);
    
    /**
     * 记录工具调用日志
     * @param proxyInfo 代理信息
     */
    void logToolCall(ProxyInfoDto proxyInfo);

    /**
     * 存储代理信息
     *
     * @param sessionId 会话ID
     * @param proxyInfo 代理信息
     */
    void storeProxyInfo(String sessionId, ProxyInfoDto proxyInfo);

    /**
     * 获取代理信息
     *
     * @param sessionId 会话ID
     * @return 代理信息
     */
    ProxyInfoDto getProxyInfo(String sessionId);

    /**
     * 处理SSE消息
     *
     * @param serverKey 服务器键
     * @param message   消息内容
     * @param proxyInfo 代理信息
     * @return 响应内容
     */
    String processSseMessage(String serverKey, String message, ProxyInfoDto proxyInfo);

    /**
     * 转发MCP请求
     *
     * @param serverKey      服务器键
     * @param jsonRpcRequest JSON-RPC请求
     * @param proxyInfo      代理信息
     * @return JSON-RPC响应
     */
    JsonRpcResponse forwardMcpRequest(String serverKey, JsonRpcRequest jsonRpcRequest, ProxyInfoDto proxyInfo);
    
    /**
     * 注册SSE发射器
     *
     * @param sessionId 会话ID
     * @param emitter   SSE发射器
     */
    void registerSseEmitter(String sessionId, SseEmitter emitter);
    
    /**
     * 注销SSE发射器
     *
     * @param sessionId 会话ID
     */
    void unregisterSseEmitter(String sessionId);
    
    /**
     * 发送SSE事件
     *
     * @param sessionId  会话ID
     * @param eventName  事件名称
     * @param eventData  事件数据
     */
    void sendSseEvent(String sessionId, String eventName, String eventData);
    
    /**
     * 发送心跳
     *
     * @param sessionId 会话ID
     * @return 是否成功
     */
    boolean sendHeartbeat(String sessionId);
} 